home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-20 / 7kmemupd.zip / 7000MEM.BAS next >
BASIC Source File  |  1991-08-28  |  29KB  |  1,419 lines

  1. REM  7000MEM.BAS
  2. REM
  3. REM  Compile with MS Basic Compiler
  4. REM
  5. REM  By: Anthony A. Robinson
  6. REM      UUNET:  ..!uunet!microsoft!anthonyr
  7. REM      CIS:    71540,655
  8. REM
  9. REM  Copyright Anthony A. Robinson, 1991
  10. REM  All rights reserved. Personal use only.Ç
  11.  
  12. ' $INCLUDE: 'qbx.bi'
  13.  
  14. DECLARE SUB BufToFile (AutoFileName$)
  15. DECLARE SUB BufToRadioMem (MemStart%, MemEnd%)
  16. DECLARE SUB CheckResponse ()
  17. DECLARE SUB CleanUp ()
  18. DECLARE SUB CloseCom ()
  19. DECLARE SUB DisplayBuf ()
  20. DECLARE SUB DisplayHeader ()
  21. DECLARE SUB DisplayLine (Row%, Col%, Align$, Line$)
  22. DECLARE SUB DisplayMenu ()
  23. DECLARE SUB EditBuffer ()
  24. DECLARE SUB Experiment ()
  25. DECLARE SUB FileToBuf (FileName$)
  26. DECLARE SUB Flush ()
  27. DECLARE SUB GetFreqAndMode (Freq!, Mode%)
  28. DECLARE SUB GetPortStatus ()
  29. DECLARE SUB Init ()
  30. DECLARE SUB InitBuf (MemStart%, MemEnd%)
  31. DECLARE SUB Main ()
  32. DECLARE SUB OpenCom ()
  33. DECLARE SUB RadioMemToBuf (MemStart%, MemEnd%)
  34. DECLARE SUB ReadConfig ()
  35. DECLARE SUB ReceiveFreq (Freq!)
  36. DECLARE SUB ReceiveMode (Mode%)
  37. DECLARE SUB SendCmd (CMD%, Data$)
  38. DECLARE SUB SendFreqAndMode (Freq!, Mode%)
  39. DECLARE SUB SetBaud ()
  40. DECLARE SUB SetEditor ()
  41. DECLARE SUB SortBuf ()
  42. DECLARE SUB UniqBuf ()
  43. DECLARE SUB WriteConfig ()
  44.  
  45. CONST FALSE = 0, TRUE = -1
  46.  
  47. COMMON SHARED ch$(), Freqs(), Modes%()
  48. COMMON SHARED LastFile$, Baud%, Baud$, Editor$
  49. COMMON SHARED DestAddr, SourceAddr, CMD1$
  50.  
  51. COMMON SHARED CMDSetFreqTX
  52. COMMON SHARED CMDSetModeTX
  53. COMMON SHARED CMDReadRange
  54. COMMON SHARED CMDReadFreq
  55. COMMON SHARED CMDReadMode
  56. COMMON SHARED CMDSetFreq
  57. COMMON SHARED CMDSetMode
  58. COMMON SHARED CMDSetVFO
  59. COMMON SHARED CMDSetMem
  60. COMMON SHARED CMDVFOtoMem
  61. COMMON SHARED CMDMemToVFO
  62. COMMON SHARED CMDClearMem
  63. COMMON SHARED CMDReadOffset
  64. COMMON SHARED CMDSetOffset
  65. COMMON SHARED CMDScan
  66.  
  67. COMMON SHARED MsgOut$, MsgIn$
  68.  
  69. DIM SHARED InRegs AS RegType, OutRegs AS RegType
  70.  
  71.  
  72. Start:
  73.    DIM ch$(110)
  74.    DIM Freqs(99)
  75.    DIM Modes%(99)
  76.    DIM SHARED Notes(1 TO 99) AS STRING * 160
  77.  
  78.    Init
  79.    Main
  80.    CloseCom
  81.  
  82.    END
  83.  
  84. SUB BufToFile (AutoFileName$)
  85.  
  86.    IF AutoFileName$ <> "" THEN
  87.       File$ = AutoFileName$
  88.    ELSE
  89.       DisplayHeader
  90.  
  91.       LOCATE 8
  92.       PRINT
  93.  
  94.       ON LOCAL ERROR GOTO BTFErr
  95.       FILES "*.frq"
  96.       ON LOCAL ERROR GOTO 0
  97.  
  98.       IF FileErr$ <> "Y" THEN
  99.          Line$ = "---------- Files previously saved ----------"
  100.          DisplayLine 7, 1, "C", Line$
  101.       ELSE
  102.          DisplayHeader
  103.       END IF
  104.  
  105.       Line$ = "Save frequencies to what file"
  106.       DisplayLine 5, 1, "C", Line$
  107.  
  108.       INPUT File$
  109.       IF File$ = "" THEN EXIT SUB
  110.  
  111.       i% = INSTR(File$, ".")
  112.  
  113.       IF i% > 1 THEN
  114.       File$ = MID$(File$, 1, i% - 1)
  115.       END IF
  116.  
  117.       File$ = File$ + ".frq"
  118.    END IF
  119.  
  120.    OPEN File$ FOR OUTPUT AS #2
  121.    LastFile$ = File$
  122.  
  123.    FOR i% = 99 TO 1 STEP -1
  124.       IF Freqs(i%) > 0 THEN
  125.          Max% = i%
  126.          EXIT FOR
  127.       END IF
  128.    NEXT i%
  129.  
  130.    FOR i% = 1 TO Max%
  131.  
  132.       IF Freqs(i%) > 0 THEN
  133.  
  134.          SELECT CASE Modes%(i%)
  135.             CASE 0
  136.                Mode$ = "0"
  137.             CASE 1
  138.                Mode$ = "AM"
  139.             CASE 2
  140.                Mode$ = "FM"
  141.             CASE 3
  142.                Mode$ = "FMN"
  143.             CASE 4
  144.                Mode$ = "SSB"
  145.             CASE ELSE
  146.                Mode$ = "???"
  147.          END SELECT
  148.  
  149.          FOR j% = 160 TO 1 STEP -1
  150.             IF MID$(Notes(i%), j%, 1) <> " " THEN EXIT FOR
  151.          NEXT j%
  152.  
  153.          IF j% > 0 THEN
  154.             PRINT #2, USING "###.####" + CHR$(&H9) + "&" + CHR$(&H9) + "&"; Freqs(i%); Mode$; MID$(Notes(i%), 1, j%)
  155.          ELSE
  156.             PRINT #2, USING "###.####" + CHR$(&H9) + "&"; Freqs(i%); Mode$
  157.          END IF
  158.  
  159.       ELSE
  160.  
  161.          PRINT #2, ""
  162.  
  163.       END IF
  164.  
  165.    NEXT i%
  166.  
  167.    CLOSE #2
  168.  
  169.    EXIT SUB
  170.  
  171. BTFErr:
  172.    FileErr$ = "Y"
  173.    RESUME NEXT
  174.  
  175. END SUB
  176.  
  177. SUB BufToRadioMem (MemStart%, MemEnd%)
  178.  
  179.    DisplayHeader
  180.  
  181.    Line$ = "This will overwrite all existing memory locations in the radio."
  182.    DisplayLine 5, 0, "C", Line$
  183.  
  184.    Line$ = "Are you sure this is what you want to do?"
  185.    DisplayLine 7, 0, "C", Line$
  186.  
  187.    ans$ = INPUT$(1)
  188.    IF NOT (ans$ = "y" OR ans$ = "Y") THEN EXIT SUB
  189.  
  190.    DisplayHeader
  191.  
  192.    Line$ = "Transferring:  Buffer --> Radio"
  193.    DisplayLine 5, 0, "C", Line$
  194.  
  195.    Line$ = "(Press <SPACE> to abort)"
  196.    DisplayLine 9, 0, "C", Line$
  197.  
  198.    COMErr = FALSE
  199.    ON LOCAL ERROR GOTO COMError1
  200.  
  201.    IF LOC(1) > 0 THEN x$ = INPUT$(LOC(1), #1)
  202.  
  203.    FOR memory% = MemStart% TO MemEnd%
  204.       
  205.       IF INKEY$ = " " THEN EXIT FOR
  206.  
  207.       Freq = Freqs(memory%)
  208.       Mode% = Modes%(memory%)
  209.  
  210.       LOCATE 7, 29: PRINT USING "Memory:##  ###.####Mhz"; memory%; Freq
  211.  
  212.       CMD% = CMDSetMem
  213.       Data$ = ch$(memory%)
  214.  
  215.       COMErr = TRUE
  216.       WHILE COMErr
  217.          COMErr = FALSE
  218.          SendCmd CMD%, Data$
  219.       WEND
  220.  
  221.       Data$ = ""
  222.       Flush
  223.       Flush
  224.  
  225.       IF Freq >= 25 AND Freq <= 1000 THEN
  226.          Freq$ = STR$(Freq)
  227.          Freq$ = MID$(Freq$, 2, LEN(Freq$) - 1)
  228.          IF Freq < 100 THEN Freq$ = "0" + Freq$
  229.  
  230.          FOR i% = 1 TO 5
  231.             Freq$ = Freq$ + "0"
  232.          NEXT i%
  233.  
  234.          Data$ = CHR$(0)
  235.          Data$ = Data$ + CHR$(16 * VAL(MID$(Freq$, 7, 1)) + VAL(MID$(Freq$, 8, 1)))
  236.          Data$ = Data$ + CHR$(16 * VAL(MID$(Freq$, 5, 1)) + VAL(MID$(Freq$, 6, 1)))
  237.          Data$ = Data$ + CHR$(16 * VAL(MID$(Freq$, 2, 1)) + VAL(MID$(Freq$, 3, 1)))
  238.          Data$ = Data$ + CHR$(VAL(MID$(Freq$, 1, 1)))
  239.  
  240.          CMD% = CMDSetFreq
  241.  
  242.          COMErr = TRUE
  243.          WHILE COMErr
  244.             COMErr = FALSE
  245.          SendCmd CMD%, Data$
  246.          WEND
  247.  
  248.          Data$ = ""
  249.          Flush
  250.          Flush
  251.  
  252.          CMD% = CMDSetMode
  253.          IF Modes%(memory%) = 1 THEN Data$ = CHR$(&H2)
  254.          IF Modes%(memory%) = 2 THEN Data$ = CHR$(&H5)
  255.          IF Modes%(memory%) = 3 THEN Data$ = CHR$(&H5) + CHR$(&H2)
  256.          IF Modes%(memory%) = 4 THEN Data$ = CHR$(&H5) + CHR$(&H0)
  257.  
  258.          COMErr = TRUE
  259.          WHILE COMErr
  260.             COMErr = FALSE
  261.             SendCmd CMD%, Data$
  262.          WEND
  263.  
  264.          Data$ = ""
  265.          Flush
  266.          Flush
  267.  
  268.          CMD% = CMDVFOtoMem
  269.          Data$ = ""
  270.  
  271.          COMErr = TRUE
  272.          WHILE COMErr
  273.             COMErr = FALSE
  274.             SendCmd CMD%, Data$
  275.          WEND
  276.  
  277.          Data$ = ""
  278.          Flush
  279.          Flush
  280.  
  281.       ELSE
  282.  
  283.          CMD% = CMDClearMem
  284.          Data$ = ""
  285.  
  286.          COMErr = TRUE
  287.          WHILE COMErr
  288.             COMErr = FALSE
  289.             SendCmd CMD%, Data$
  290.          WEND
  291.  
  292.          Data$ = ""
  293.          Flush
  294.          Flush
  295.  
  296.       END IF
  297.  
  298.    NEXT memory%
  299.  
  300.    EXIT SUB
  301.  
  302.  
  303. COMError1:
  304.    GetPortStatus
  305.    COMErr = TRUE
  306.  
  307.    Line$ = "COM port error detected -- attempting to fix, please wait."
  308.    DisplayLine 12, 0, "C", Line$
  309.  
  310.    CloseCom
  311.    OpenCom
  312.  
  313.    Line$ = "                                                          "
  314.    DisplayLine 12, 0, "C", Line$
  315.  
  316.    RESUME NEXT
  317. END SUB
  318.  
  319. SUB CheckResponse
  320.  
  321. CRTop:
  322.    a$ = INPUT$(1, #1)                         ' Get next character
  323.    v% = ASC(a$)                               ' Convert to number
  324.    h$ = HEX$(v%)                              ' Convert to hex string
  325.    PRINT h$;                                  ' Print it out
  326.    PRINT " ";
  327.    IF v% = &HFD THEN PRINT : EXIT SUB         ' Look for end byte
  328.    GOTO CRTop                                 ' Loop back for next char
  329.  
  330. END SUB
  331.  
  332. SUB CloseCom
  333.  
  334.    CLOSE #1
  335.  
  336. END SUB
  337.  
  338. SUB DisplayBuf
  339.  
  340.    DisplayHeader
  341.  
  342.    FOR i% = 1 TO 99
  343.  
  344.       Row% = i%
  345.  
  346.       IF i% < 21 THEN
  347.          Col% = 1
  348.       END IF
  349.  
  350.       IF i% > 20 AND i% < 41 THEN
  351.          Col% = 16
  352.          Row% = i% - 20
  353.       END IF
  354.  
  355.       IF i% > 40 AND i% < 61 THEN
  356.          Col% = 31
  357.          Row% = i% - 40
  358.       END IF
  359.  
  360.       IF i% > 60 AND i% < 81 THEN
  361.          Col% = 46
  362.          Row% = i% - 60
  363.       END IF
  364.  
  365.       IF i% > 80 THEN
  366.          Col% = 61
  367.          Row% = i% - 80
  368.       END IF
  369.  
  370.       LOCATE Row% + 3, Col%
  371.  
  372.       IF Freqs(i%) > 0 THEN
  373.          PRINT USING "##. ###.####~#"; i%; Freqs(i%); Modes%(i%)
  374.       ELSE
  375.          PRINT USING "##."; i%
  376.       END IF
  377.  
  378.    NEXT i%
  379.  
  380.    Line$ = "Press any key to continue..."
  381.    DisplayLine 25, 0, "C", Line$
  382.  
  383.    x$ = INPUT$(1)
  384.  
  385. END SUB
  386.  
  387. SUB DisplayHeader
  388.  
  389.    CLS
  390.    Line$ = "*** ICOM IC-R7000 Memory Backup and Restore Utility ***"
  391.    DisplayLine 1, 0, "C", Line$
  392.  
  393.    IF LastFile$ <> "" THEN
  394.       Line$ = "Current frequency file: " + LastFile$
  395.       DisplayLine 3, 0, "C", Line$
  396.    END IF
  397.  
  398. END SUB
  399.  
  400. SUB DisplayLine (Row%, Col%, Align$, Line$)
  401.  
  402.    Align$ = UCASE$(Align$)
  403.  
  404.    SELECT CASE Align$
  405.       CASE "C"
  406.          Col% = INT(((80 - LEN(Line$)) / 2) + .5)
  407.  
  408.       CASE "L"
  409.          Col% = 1
  410.  
  411.       CASE "R"
  412.          Col% = INT(80 - LEN(Line$))
  413.  
  414.       CASE ELSE
  415.  
  416.          IF Col% = 0 THEN Col% = 1
  417.    END SELECT
  418.  
  419.    IF Row% > 0 THEN
  420.       LOCATE Row%, Col%: PRINT Line$;
  421.    ELSE
  422.       LOCATE , Col%: PRINT Line$;
  423.    END IF
  424.  
  425. END SUB
  426.  
  427. SUB DisplayMenu
  428.  
  429.    DisplayHeader
  430.  
  431.    Line$ = "* Radio Memory Functions *"
  432.    DisplayLine 5, 0, "C", Line$
  433.  
  434.    Line$ = "1. Retrieve Radio Memories into Buffer         "
  435.    DisplayLine 7, 0, "C", Line$
  436.  
  437.    Line$ = "2. Write Buffer to Radio Memories              "
  438.    DisplayLine 8, 0, "C", Line$
  439.  
  440.    Line$ = "3. Retrieve Scan Memories 80-99 into Buffer    "
  441.    DisplayLine 9, 0, "C", Line$
  442.  
  443.  
  444.    Line$ = "* Disk File Functions *"
  445.    DisplayLine 11, 0, "C", Line$
  446.  
  447.    Line$ = "4. Retrieve Freq File into Buffer              "
  448.    DisplayLine 13, 0, "C", Line$
  449.  
  450.    Line$ = "5. Write Buffer to Freq File                   "
  451.    DisplayLine 14, 0, "C", Line$
  452.  
  453.  
  454.    Line$ = "* Other Functions *"
  455.    DisplayLine 16, 0, "C", Line$
  456.  
  457.    Line$ = "6. Display Buffer Contents   8. Set Baud Rate  "
  458.    DisplayLine 18, 0, "C", Line$
  459.  
  460.    Line$ = "7. Edit Buffer Contents      9. Set Your Editor"
  461.    DisplayLine 19, 0, "C", Line$
  462.  
  463.  
  464.    Line$ = "Q. Quit"
  465.    DisplayLine 21, 0, "C", Line$
  466.  
  467. END SUB
  468.  
  469. SUB EditBuffer
  470.  
  471.    IF LastFile$ = "" THEN
  472.       LastFile$ = "buffer.frq"
  473.    END IF
  474.  
  475.    BufToFile LastFile$
  476.  
  477.    SHELL Editor$ + " " + LastFile$
  478.  
  479.    FileToBuf LastFile$
  480.  
  481. END SUB
  482.  
  483. SUB Experiment
  484.  
  485.    IF LOC(1) > 0 THEN x$ = INPUT$(LOC(1), #1)
  486.  
  487.    CMD% = CMDScan
  488.    Data$ = CHR$(&H42)
  489.    SendCmd CMD%, Data$
  490.    Data$ = ""
  491.    CheckResponse
  492.    CheckResponse
  493.    x$ = INPUT$(1)
  494.  
  495. END SUB
  496.  
  497. SUB FileToBuf (File$)
  498.  
  499.    DIM Files$(100)
  500.  
  501.    IF File$ = "" THEN
  502.  
  503.       FileErr$ = ""
  504.       DisplayHeader
  505.  
  506.       ON LOCAL ERROR GOTO FTBErr
  507.       SHELL "dir *.frq > dir.tmp"
  508.       ON LOCAL ERROR GOTO 0
  509.  
  510.       IF FileErr$ <> "Y" THEN
  511.          Line$ = "---------- Files previously saved ----------"
  512.          DisplayLine 5, 1, "C", Line$
  513.       ELSE
  514.          DisplayHeader
  515.          Line$ = "*** There are no frequency files available ***"
  516.          DisplayLine 5, 1, "C", Line$
  517.          Line$ = "Press any key to contine..."
  518.          DisplayLine 7, 1, "C", Line$
  519.          x$ = INPUT$(1)
  520.          EXIT SUB
  521.       END IF
  522.  
  523.       OPEN "dir.tmp" FOR INPUT AS #2
  524.  
  525.       i% = 0
  526.  
  527.       DO WHILE NOT EOF(2)
  528.  
  529.          LINE INPUT #2, Line$
  530.  
  531.          File$ = LEFT$(Line$, INSTR(Line$, " "))
  532.  
  533.          IF File$ > " " THEN
  534.             i% = i% + 1
  535.             Files$(i%) = LCASE$(File$)
  536.             Max% = i%
  537.          END IF
  538.  
  539.       LOOP
  540.  
  541.       CLOSE #2
  542.       KILL "dir.tmp"
  543.  
  544.       Rows% = INT((Max% - 1) / 5) + 1
  545.  
  546.       FOR Col% = 1 TO 5
  547.          FOR Row% = 1 TO Rows%
  548.  
  549.             LOCATE Row% + 6, INT((Col% - 1) * 16 + 1)
  550.             i% = (Col% - 1) * Rows% + Row%
  551.             IF i% <= Max% THEN PRINT USING "##. \         \"; i%; Files$(i%);
  552.  
  553.          NEXT Row%
  554.       NEXT Col%
  555.  
  556.       Line$ = "Enter Choice"
  557.       DisplayLine Rows% + 8, 1, "C", Line$
  558.  
  559.       INPUT Number%
  560.       IF Number% = 0 THEN EXIT SUB
  561.       IF Number% < 0 OR Number% > Max% THEN EXIT SUB
  562.  
  563.       File$ = Files$(Number%)
  564.  
  565.    END IF
  566.  
  567.    IF RIGHT$(File$, 1) = " " THEN File$ = LEFT$(File$, LEN(File$) - 1)
  568.  
  569.    IF INSTR(File$, ".") = 0 THEN File$ = LCASE$(File$ + ".frq")
  570.  
  571.    FileErr$ = ""
  572.  
  573.    ON LOCAL ERROR GOTO FTBErr
  574.    OPEN File$ FOR INPUT AS #2
  575.    ON LOCAL ERROR GOTO 0
  576.  
  577.    IF FileErr$ = "Y" THEN
  578.       PRINT "Error opening "; File$
  579.       x$ = INPUT$(1)
  580.       EXIT SUB
  581.    END IF
  582.  
  583.    LastFile$ = File$
  584.    InitBuf 1, 99
  585.  
  586.    i% = 0
  587.  
  588.    DO WHILE NOT EOF(2)
  589.  
  590.       i% = i% + 1
  591.  
  592.       IF i% < 100 THEN
  593.  
  594.          LINE INPUT #2, Line$
  595.  
  596.          IF LEN(Line$) > 0 THEN
  597.  
  598.             ' --- Kill any leading spaces or tabs
  599.  
  600.             FOR j% = 1 TO LEN(Line$)
  601.                AsciiChar = ASC(MID$(Line$, j%, 1))
  602.                IF AsciiChar <> 32 AND AsciiChar <> 9 THEN
  603.                   cut% = j%
  604.                   EXIT FOR
  605.                END IF
  606.             NEXT j%
  607.  
  608.             IF j% > LEN(Line$) THEN
  609.                cut% = j%
  610.             END IF
  611.  
  612.             Line$ = MID$(Line$, cut%)
  613.  
  614.             ' --- Get the first item on the line (hopefully the freq)
  615.  
  616.             FOR j% = 1 TO LEN(Line$)
  617.                AsciiChar = ASC(MID$(Line$, j%, 1))
  618.                IF AsciiChar = 32 OR AsciiChar = 9 THEN
  619.                   cut% = j% - 1
  620.                   EXIT FOR
  621.                END IF
  622.             NEXT j%
  623.  
  624.             IF j% > LEN(Line$) THEN
  625.                cut% = j%
  626.             END IF
  627.  
  628.             Freqs(i%) = VAL(MID$(Line$, 1, cut%))
  629.  
  630.             Line$ = MID$(Line$, cut% + 1)
  631.  
  632.             ' --- Skip over any intervening spaces or tabs
  633.  
  634.             FOR j% = 1 TO LEN(Line$)
  635.                AsciiChar = ASC(MID$(Line$, j%, 1))
  636.                IF AsciiChar <> 32 AND AsciiChar <> 9 THEN
  637.                   cut% = j%
  638.                   EXIT FOR
  639.                END IF
  640.             NEXT j%
  641.  
  642.             IF j% > LEN(Line$) THEN
  643.                cut% = j%
  644.             END IF
  645.  
  646.             Line$ = MID$(Line$, cut%)
  647.  
  648.             ' --- Get the second item on the line (hopefully the mode)
  649.  
  650.             FOR j% = 1 TO LEN(Line$)
  651.                AsciiChar = ASC(MID$(Line$, j%, 1))
  652.                IF AsciiChar = 32 OR AsciiChar = 9 THEN
  653.                   cut% = j% - 1
  654.                   EXIT FOR
  655.                END IF
  656.             NEXT j%
  657.  
  658.             IF j% > LEN(Line$) THEN
  659.                cut% = j%
  660.             END IF
  661.  
  662.             Mode$ = UCASE$(MID$(Line$, 1, cut%))
  663.  
  664.  
  665.             SELECT CASE Mode$
  666.  
  667.                CASE "AM"
  668.                   Modes%(i%) = 1
  669.                   cut% = cut% + 1
  670.  
  671.                CASE "FM"
  672.                   Modes%(i%) = 2
  673.                   cut% = cut% + 1
  674.  
  675.                CASE "FMN"
  676.                   Modes%(i%) = 3
  677.                   cut% = cut% + 1
  678.  
  679.                CASE "SSB"
  680.                   Modes%(i%) = 4
  681.                   cut% = cut% + 1
  682.  
  683.                CASE "USB"
  684.                   Modes%(i%) = 4
  685.                   cut% = cut% + 1
  686.  
  687.                CASE "LSB"
  688.                   Modes%(i%) = 4
  689.                   cut% = cut% + 1
  690.  
  691.                CASE ELSE
  692.                   Modes%(i%) = VAL(Mode$)
  693.  
  694.                   IF Freqs(i%) > 0 AND Modes%(i%) = 0 THEN
  695.                      Modes%(i%) = 3
  696.                      cut% = 1
  697.                   ELSE
  698.                      cut% = cut% + 1
  699.                   END IF
  700.  
  701.             END SELECT
  702.  
  703.  
  704.             Line$ = MID$(Line$, cut%)
  705.  
  706.             ' --- Skip over any intervening spaces or tabs
  707.  
  708.             FOR j% = 1 TO LEN(Line$)
  709.                AsciiChar = ASC(MID$(Line$, j%, 1))
  710.                IF AsciiChar <> 32 AND AsciiChar <> 9 THEN
  711.                   cut% = j%
  712.                   EXIT FOR
  713.                END IF
  714.             NEXT j%
  715.  
  716.             IF j% > LEN(Line$) THEN
  717.                cut% = j%
  718.             END IF
  719.  
  720.             Notes(i%) = MID$(Line$, cut%)
  721.  
  722.          END IF
  723.  
  724.       ELSE
  725.  
  726.          EXIT DO
  727.  
  728.       END IF
  729.  
  730.    LOOP
  731.  
  732.    CLOSE #2
  733.  
  734.    EXIT SUB
  735.  
  736. FTBErr:
  737.    FileErr$ = "Y"
  738.    RESUME NEXT
  739.  
  740. END SUB
  741.  
  742. SUB Flush
  743.  
  744. '   IF LOC(1) > 0 THEN
  745. '      x$ = INPUT$(LOC(1), #1)
  746. '   END IF
  747. '   FOR i% = 1 TO 1700
  748. '   NEXT i%
  749. '   EXIT SUB
  750.  
  751.    err$ = ""
  752.    MsgIn$ = ""
  753.  
  754. FlushTop:
  755.    a$ = INPUT$(1, #1)
  756.    v% = ASC(a$)
  757.    h$ = HEX$(v%)
  758.  
  759.    IF err$ = "" THEN
  760.       IF v% = &HFA THEN err$ = "Y"
  761.       IF v% = &HFB THEN err$ = "N"
  762.    END IF
  763.  
  764.    MsgIn$ = MsgIn$ + " " + h$
  765.  
  766.    IF v% = &HFD THEN
  767.       GOTO FlushExit
  768.    ELSE
  769.       GOTO FlushTop
  770.    END IF
  771.  
  772. FlushExit:
  773.    IF err$ = "Y" THEN
  774.       PRINT
  775.       PRINT "*** ERROR ***"
  776.       PRINT "Last message out ", MsgOut$
  777.       PRINT "Last message back", MsgIn$
  778.       x$ = INPUT$(1)
  779.    END IF
  780.  
  781. END SUB
  782.  
  783. SUB GetFreqAndMode (Freq, Mode%)
  784.  
  785.    CMD% = CMDReadFreq
  786.    Data$ = ""
  787.  
  788.    COMErr = TRUE
  789.    WHILE COMErr
  790.       COMErr = FALSE
  791.       SendCmd CMD%, Data$
  792.    WEND
  793.  
  794.    Data$ = ""
  795.    Flush
  796.    ReceiveFreq Freq
  797.  
  798.    CMD% = CMDReadMode
  799.    Data$ = ""
  800.  
  801.    COMErr = TRUE
  802.    WHILE COMErr
  803.       COMErr = FALSE
  804.       SendCmd CMD%, Data$
  805.    WEND
  806.  
  807.    Data$ = ""
  808.    Flush
  809.    ReceiveMode Mode%
  810.  
  811. END SUB
  812.  
  813. SUB GetPortStatus
  814.  
  815.    MessageCount% = 0
  816.  
  817.    InRegs.AX = &H300
  818.    CALL Interrupt(&H14, InRegs, OutRegs)
  819.  
  820.    ' PRINT HEX$(OutRegs.AX)
  821.  
  822.    IF OutRegs.AX AND 2 ^ 8 THEN
  823.       PRINT "Data Ready"
  824.    END IF
  825.  
  826.    IF OutRegs.AX AND 2 ^ 9 THEN
  827.       PRINT "Overrun Error"
  828.    END IF
  829.  
  830.    IF OutRegs.AX AND 2 ^ 10 THEN
  831.       PRINT "Parity Error"
  832.    END IF
  833.  
  834.    IF OutRegs.AX AND 2 ^ 11 THEN
  835.       PRINT "Framing Error"
  836.    END IF
  837.  
  838.    IF OutRegs.AX AND 2 ^ 12 THEN
  839.       PRINT "Break-detect Error"
  840.    END IF
  841.  
  842.    IF OutRegs.AX AND 2 ^ 13 THEN
  843.       PRINT "Transfer holding register empty"
  844.    END IF
  845.  
  846.    IF OutRegs.AX AND 2 ^ 14 THEN
  847.       PRINT "Transfer shift register empty"
  848.    END IF
  849.  
  850.    IF OutRegs.AX AND 2 ^ 15 THEN
  851.       PRINT "Timeout Error"
  852.    END IF
  853.  
  854.  
  855.  
  856.    IF OutRegs.AX AND 2 ^ 0 THEN
  857.       PRINT "CTS change"
  858.    END IF
  859.  
  860.    IF OutRegs.AX AND 2 ^ 1 THEN
  861.       PRINT "DSR change"
  862.    END IF
  863.  
  864.    IF OutRegs.AX AND 2 ^ 2 THEN
  865.       PRINT "Trailing-edge ring detector"
  866.    END IF
  867.  
  868.    IF OutRegs.AX AND 2 ^ 3 THEN
  869.       PRINT "RD change"
  870.    END IF
  871.  
  872.    IF OutRegs.AX AND 2 ^ 4 THEN
  873.       PRINT "CTS"
  874.    END IF
  875.  
  876.    IF OutRegs.AX AND 2 ^ 5 THEN
  877.       PRINT "DSR"
  878.    END IF
  879.  
  880.    IF OutRegs.AX AND 2 ^ 6 THEN
  881.       PRINT "RI"
  882.    END IF
  883.  
  884.    IF OutRegs.AX AND 2 ^ 7 THEN
  885.       PRINT "RD"
  886.    END IF
  887.  
  888.    PRINT
  889. END SUB
  890.  
  891. SUB Init
  892.  
  893.    COLOR 7, 1
  894.    DisplayHeader
  895.  
  896.    Line$ = "Initializing..."
  897.    DisplayLine 12, 0, "C", Line$
  898.  
  899.    DestAddr = 8          ' Destination address (R7000)
  900.    SourceAddr = &HF1     ' Source address (IBM PC)
  901.  
  902.    CMDSetFreqTX = 0
  903.    CMDSetModeTX = 1
  904.    CMDReadRange = 2
  905.    CMDReadFreq = 3
  906.    CMDReadMode = 4
  907.    CMDSetFreq = 5
  908.    CMDSetMode = 6
  909.    CMDSetVFO = 7
  910.    CMDSetMem = 8
  911.    CMDVFOtoMem = 9
  912.    CMDMemToVFO = &HA
  913.    CMDClearMem = &HB
  914.    CMDReadOffset = &HC
  915.    CMDSetOffset = &HD
  916.    CMDScan = &HE
  917.  
  918.    Baud% = 9600
  919.    Editor$ = "vi"
  920.    LastFile$ = ""
  921.  
  922.    ReadConfig
  923.  
  924.    CMD1$ = CHR$(&HFE) + CHR$(&HFE) + CHR$(DestAddr) + CHR$(SourceAddr)
  925.  
  926.    OpenCom
  927.  
  928.    FOR i% = 0 TO 9
  929.       FOR j% = 0 TO 9
  930.          ch$(10 * i% + j%) = CHR$(16 * i% + j%)
  931.       NEXT j%
  932.    NEXT i%
  933.  
  934.    InitBuf 1, 99
  935.  
  936. END SUB
  937.  
  938. SUB InitBuf (MemStart%, MemEnd%)
  939.  
  940.    FOR i% = MemStart% TO MemEnd%
  941.       Freqs(i%) = 0
  942.       Modes%(i%) = 0
  943.       Notes(i%) = ""
  944.    NEXT i%
  945.  
  946. END SUB
  947.  
  948. SUB Main
  949.    DisplayMenu
  950.    Incr = .005
  951.  
  952. GetMenuItem:
  953.    Item$ = UCASE$(INKEY$)
  954.    IF Item$ = "" GOTO GetMenuItem
  955.  
  956.    IF LEN(Item$) = 2 AND ASC(LEFT$(Item$, 1)) = 0 THEN
  957.  
  958.       code% = ASC(RIGHT$(Item$, 1))
  959.  
  960.       SELECT CASE code%
  961.  
  962.          CASE 72
  963.             GetFreqAndMode Freq, Mode%
  964.             Freq = Freq + Incr
  965.             SendFreqAndMode Freq, 0
  966.  
  967.          CASE 80
  968.             GetFreqAndMode Freq, Mode%
  969.             Freq = Freq - Incr
  970.             SendFreqAndMode Freq, 0
  971.  
  972.          CASE 75
  973.             Incr = Incr - .0005
  974.             IF Incr < .0005 THEN Incr = .0005
  975.  
  976.          CASE 77
  977.             Incr = Incr + .0005
  978.  
  979.       END SELECT
  980.  
  981.    ELSE
  982.  
  983.       Item% = VAL(Item$)
  984.  
  985.       SELECT CASE Item%
  986.  
  987.          CASE 1
  988.             LastFile$ = ""
  989.             InitBuf 1, 99
  990.             RadioMemToBuf 1, 99
  991.  
  992.          CASE 2
  993.             BufToRadioMem 1, 99
  994.  
  995.          CASE 3
  996.             InitBuf 80, 99
  997.             RadioMemToBuf 80, 99
  998.  
  999.          CASE 4
  1000.             FileToBuf ("")
  1001.  
  1002.          CASE 5
  1003.             BufToFile ("")
  1004.  
  1005.          CASE 6
  1006.             DisplayBuf
  1007.  
  1008.          CASE 7
  1009.             EditBuffer
  1010.     
  1011.          CASE 8
  1012.             SetBaud
  1013.  
  1014.          CASE 9
  1015.             SetEditor
  1016.  
  1017.          CASE ELSE
  1018.  
  1019.             SELECT CASE Item$
  1020.  
  1021.                CASE "X"
  1022.                   Experiment
  1023.  
  1024.                CASE "S"
  1025.                   SortBuf
  1026.          
  1027.                CASE "U"
  1028.                   UniqBuf
  1029.  
  1030.                CASE "Q"
  1031.                   EXIT SUB
  1032.  
  1033.             END SELECT
  1034.  
  1035.       END SELECT
  1036.  
  1037.    END IF
  1038.  
  1039.    DisplayMenu
  1040.    GOTO GetMenuItem
  1041.  
  1042. END SUB
  1043.  
  1044. SUB OpenCom
  1045.    Baud$ = RTRIM$(LTRIM$(STR$(Baud%)))
  1046.    OPEN "COM1:" + Baud$ + ",N,8,1,CD0,CS0,DS0,OP0,RS,TB2048,RB2048" FOR RANDOM AS #1 LEN = 1
  1047. END SUB
  1048.  
  1049. SUB RadioMemToBuf (MemStart%, MemEnd%)
  1050.  
  1051.    DisplayHeader
  1052.  
  1053.    Line$ = "Transferring:  Radio Memory --> Buffer"
  1054.    DisplayLine 5, 0, "C", Line$
  1055.  
  1056.    Line$ = "(Press <SPACE> to abort)"
  1057.    DisplayLine 9, 0, "C", Line$
  1058.  
  1059.    COMErr = FALSE
  1060.    ON LOCAL ERROR GOTO COMError2
  1061.  
  1062.    IF LOC(1) > 0 THEN x$ = INPUT$(LOC(1), #1)
  1063.  
  1064.    FOR memory% = MemStart% TO MemEnd%
  1065.  
  1066.       IF INKEY$ = " " THEN EXIT FOR
  1067.  
  1068.       CMD% = CMDSetMem
  1069.       Data$ = ch$(memory%)
  1070.  
  1071.       COMErr = TRUE
  1072.       WHILE COMErr
  1073.          COMErr = FALSE
  1074.          SendCmd CMD%, Data$
  1075.       WEND
  1076.  
  1077.       Data$ = ""
  1078.       Flush
  1079.       Flush
  1080.  
  1081.       CMD% = CMDReadFreq
  1082.       Data$ = ""
  1083.  
  1084.       COMErr = TRUE
  1085.       WHILE COMErr
  1086.          COMErr = FALSE
  1087.          SendCmd CMD%, Data$
  1088.       WEND
  1089.  
  1090.       Data$ = ""
  1091.       Flush
  1092.       ReceiveFreq Freq
  1093.  
  1094.       CMD% = CMDReadMode
  1095.       Data$ = ""
  1096.  
  1097.       COMErr = TRUE
  1098.       WHILE COMErr
  1099.          COMErr = FALSE
  1100.          SendCmd CMD%, Data$
  1101.       WEND
  1102.  
  1103.       Data$ = ""
  1104.       Flush
  1105.       ReceiveMode Mode%
  1106.  
  1107.       Freqs(memory%) = Freq
  1108.       Modes%(memory%) = Mode%
  1109.  
  1110.       LOCATE 7, 29: PRINT USING "Memory:##  ###.####Mhz"; memory%; Freq
  1111.  
  1112.    NEXT memory%
  1113.  
  1114.    EXIT SUB
  1115.  
  1116.  
  1117. COMError2:
  1118.    GetPortStatus
  1119.    COMErr = TRUE
  1120.  
  1121.    Line$ = "COM port error detected -- attempting to fix, please wait."
  1122.    DisplayLine 12, 0, "C", Line$
  1123.  
  1124.    CloseCom
  1125.    OpenCom
  1126.  
  1127.    Line$ = "                                                          "
  1128.    DisplayLine 12, 0, "C", Line$
  1129.  
  1130.    RESUME NEXT
  1131. END SUB
  1132.  
  1133. SUB ReadConfig
  1134.    FileErr$ = ""
  1135.  
  1136.    ON LOCAL ERROR GOTO RCErr
  1137.    OPEN "7000mem.cfg" FOR INPUT AS #2
  1138.    ON LOCAL ERROR GOTO 0
  1139.  
  1140.    IF FileErr$ = "Y" THEN
  1141.       WriteConfig
  1142.    ELSE
  1143.       INPUT #2, Baud%, Editor$
  1144.       CLOSE #2
  1145.    END IF
  1146.  
  1147.    EXIT SUB
  1148.  
  1149. RCErr:
  1150.    FileErr$ = "Y"
  1151.    RESUME NEXT
  1152.  
  1153. END SUB
  1154.  
  1155. SUB ReceiveFreq (Freq)
  1156.  
  1157.    Freq = 0
  1158.    Count% = 0
  1159.  
  1160. RFLoop:
  1161.    Count% = Count% + 1
  1162.    a$ = INPUT$(1, #1)                    ' Get next character
  1163.    v% = ASC(a$)                          ' Convert to number
  1164.    IF v% = &HFD THEN EXIT SUB            ' Look for end byte
  1165.  
  1166.    h$ = HEX$(v%)                         ' Convert to hex string
  1167.  
  1168.    IF Count% = 6 THEN Freq = Freq + VAL(h$) / 1000000
  1169.    IF Count% = 7 THEN Freq = Freq + VAL(h$) / 10000
  1170.    IF Count% = 8 THEN Freq = Freq + VAL(h$) / 100
  1171.    IF Count% = 9 THEN Freq = Freq + VAL(h$)
  1172.    IF Count% = 10 THEN Freq = Freq + VAL(h$) * 100
  1173.  
  1174.    GOTO RFLoop                           ' Loop back for next char
  1175.  
  1176. END SUB
  1177.  
  1178. SUB ReceiveMode (Mode%)
  1179.  
  1180.    Mode% = 0
  1181.    Count% = 0
  1182.  
  1183. RMLoop:
  1184.    Count% = Count% + 1
  1185.    a$ = INPUT$(1, #1)                 ' Get next character
  1186.    v% = ASC(a$)                       ' Convert to number
  1187.    IF v% = &HFD THEN
  1188.       EXIT SUB
  1189.    ELSE
  1190.       h$ = HEX$(v%)                   ' Convert to hex string
  1191.  
  1192.       IF Count% = 6 THEN
  1193.          IF VAL(h$) = 2 THEN Mode% = 1
  1194.          IF VAL(h$) = 5 THEN Mode% = 2
  1195.       END IF
  1196.  
  1197.       IF Count% = 7 THEN
  1198.          IF VAL(h$) = 2 THEN Mode% = 3
  1199.          IF VAL(h$) = 0 THEN Mode% = 4
  1200.       END IF
  1201.  
  1202.       GOTO RMLoop                     ' Loop back for next char
  1203.    END IF
  1204.  
  1205. END SUB
  1206.  
  1207. SUB SendCmd (CMD%, Data$)
  1208.  
  1209.    Msg$ = CMD1$ + CHR$(CMD%) + Data$ + CHR$(&HFD)
  1210.    MsgOut$ = ""
  1211.  
  1212.    FOR i% = 1 TO LEN(Msg$)
  1213.       MsgOut$ = MsgOut$ + " " + HEX$(ASC(MID$(Msg$, i%, 1)))
  1214.    NEXT i%
  1215.  
  1216.    PRINT #1, CMD1$; CHR$(CMD%); Data$; CHR$(&HFD);
  1217.  
  1218. END SUB
  1219.  
  1220. SUB SendFreqAndMode (Freq, Mode%)
  1221.  
  1222.    IF Freq >= 25 AND Freq <= 1000 THEN
  1223.       Freq$ = STR$(Freq)
  1224.       Freq$ = MID$(Freq$, 2, LEN(Freq$) - 1)
  1225.       IF Freq < 100 THEN Freq$ = "0" + Freq$
  1226.  
  1227.       FOR i% = 1 TO 5
  1228.          Freq$ = Freq$ + "0"
  1229.       NEXT i%
  1230.  
  1231.       Data$ = CHR$(0)
  1232.       Data$ = Data$ + CHR$(16 * VAL(MID$(Freq$, 7, 1)) + VAL(MID$(Freq$, 8, 1)))
  1233.       Data$ = Data$ + CHR$(16 * VAL(MID$(Freq$, 5, 1)) + VAL(MID$(Freq$, 6, 1)))
  1234.       Data$ = Data$ + CHR$(16 * VAL(MID$(Freq$, 2, 1)) + VAL(MID$(Freq$, 3, 1)))
  1235.       Data$ = Data$ + CHR$(VAL(MID$(Freq$, 1, 1)))
  1236.  
  1237.       CMD% = CMDSetFreq
  1238.  
  1239.       COMErr = TRUE
  1240.       WHILE COMErr
  1241.          COMErr = FALSE
  1242.       SendCmd CMD%, Data$
  1243.       WEND
  1244.  
  1245.       Data$ = ""
  1246.       Flush
  1247.       Flush
  1248.  
  1249.       IF Mode% > 0 AND Mode% < 5 THEN
  1250.          CMD% = CMDSetMode
  1251.          IF Mode% = 1 THEN Data$ = CHR$(&H2)
  1252.          IF Mode% = 2 THEN Data$ = CHR$(&H5)
  1253.          IF Mode% = 3 THEN Data$ = CHR$(&H5) + CHR$(&H2)
  1254.          IF Mode% = 4 THEN Data$ = CHR$(&H5) + CHR$(&H0)
  1255.  
  1256.          COMErr = TRUE
  1257.          WHILE COMErr
  1258.             COMErr = FALSE
  1259.             SendCmd CMD%, Data$
  1260.          WEND
  1261.  
  1262.          Data$ = ""
  1263.          Flush
  1264.          Flush
  1265.       END IF
  1266.  
  1267.     END IF
  1268.  
  1269. END SUB
  1270.  
  1271. SUB SetBaud
  1272.  
  1273. SetBaudTop:
  1274.    DisplayHeader
  1275.  
  1276.    Line$ = "Current baud rate: " + Baud$
  1277.    DisplayLine 5, 1, "C", Line$
  1278.  
  1279.  
  1280.    Line$ = "Valid baud rates: "
  1281.    DisplayLine 7, 1, "C", Line$
  1282.  
  1283.    Line$ = "1. 300 "
  1284.    DisplayLine 9, 1, "C", Line$
  1285.  
  1286.    Line$ = "2. 1200"
  1287.    DisplayLine 10, 1, "C", Line$
  1288.  
  1289.    Line$ = "3. 2400"
  1290.    DisplayLine 11, 1, "C", Line$
  1291.  
  1292.    Line$ = "4. 9600"
  1293.    DisplayLine 12, 0, "C", Line$
  1294.  
  1295.    Line$ = "Select a baud rate"
  1296.    DisplayLine 14, 1, "C", Line$
  1297.  
  1298.    INPUT Item$
  1299.    Item% = VAL(Item$)
  1300.    IF Item$ = "" THEN EXIT SUB
  1301.  
  1302.    SELECT CASE Item%
  1303.       CASE 1
  1304.          newBaud% = 300
  1305.  
  1306.       CASE 2
  1307.          newBaud% = 1200
  1308.  
  1309.       CASE 3
  1310.          newBaud% = 2400
  1311.  
  1312.       CASE 4
  1313.          newBaud% = 9600
  1314.  
  1315.       CASE ELSE
  1316.          newBaud% = 0
  1317.  
  1318.    END SELECT
  1319.  
  1320.    IF newBaud% = 0 THEN
  1321.       GOTO SetBaudTop
  1322.    ELSE
  1323.       CloseCom
  1324.       Baud% = newBaud%
  1325.       OpenCom
  1326.  
  1327.       WriteConfig
  1328.  
  1329.       Line$ = "Baud rate has been reset to " + Baud$
  1330.       DisplayLine 17, 1, "C", Line$
  1331.  
  1332.       Line$ = "Press any key to continue..."
  1333.       DisplayLine 20, 0, "C", Line$
  1334.  
  1335.       x$ = INPUT$(1)
  1336.    END IF
  1337.  
  1338. END SUB
  1339.  
  1340. SUB SetEditor
  1341.    DisplayHeader
  1342.  
  1343.    Line$ = "Your current editor: " + Editor$
  1344.    DisplayLine 5, 1, "C", Line$
  1345.  
  1346.    Line$ = "Change to"
  1347.    DisplayLine 7, 1, "C", Line$
  1348.  
  1349.    INPUT NewEditor$
  1350.  
  1351.    IF NewEditor$ = "" THEN
  1352.       EXIT SUB
  1353.    ELSE
  1354.       Editor$ = NewEditor$
  1355.  
  1356.       WriteConfig
  1357.  
  1358.       Line$ = "Your editor has been changed to " + Editor$
  1359.       DisplayLine 9, 1, "C", Line$
  1360.  
  1361.       Line$ = "Press any key to continue..."
  1362.       DisplayLine 12, 0, "C", Line$
  1363.  
  1364.       x$ = INPUT$(1)
  1365.    END IF
  1366.  
  1367. END SUB
  1368.  
  1369. SUB SortBuf
  1370.  
  1371.    FOR j% = 1 TO 99
  1372.       FOR i% = 1 TO 98
  1373.  
  1374.          IF Freqs(i%) > Freqs(i% + 1) THEN
  1375.  
  1376.             Freq = Freqs(i%)
  1377.             Freqs(i%) = Freqs(i% + 1)
  1378.             Freqs(i% + 1) = Freq
  1379.  
  1380.             Mode = Modes%(i%)
  1381.             Modes%(i%) = Modes%(i% + 1)
  1382.             Modes%(i% + 1) = Mode
  1383.  
  1384.             Note$ = Notes(i%)
  1385.             Notes(i%) = Notes(i% + 1)
  1386.             Notes(i% + 1) = Note$
  1387.  
  1388.          END IF
  1389.  
  1390.       NEXT i%
  1391.    NEXT j%
  1392.  
  1393. END SUB
  1394.  
  1395. SUB UniqBuf
  1396.  
  1397.    Freq = Freqs(1)
  1398.  
  1399.    FOR i% = 2 TO 99
  1400.  
  1401.       IF Freqs(i%) = Freq THEN
  1402.          Freqs(i%) = 0
  1403.          Modes%(i%) = 0
  1404.          Notes(i%) = ""
  1405.       ELSE
  1406.          Freq = Freqs(i%)
  1407.       END IF
  1408.  
  1409.    NEXT i%
  1410.  
  1411. END SUB
  1412.  
  1413. SUB WriteConfig
  1414.    OPEN "7000mem.cfg" FOR OUTPUT AS #2
  1415.    PRINT #2, Baud%, Editor$
  1416.    CLOSE #2
  1417. END SUB
  1418.  
  1419.